const { defineConfig } = require('@vue/cli-service');
const path = require('path');
const CompressionPlugin = require('compression-webpack-plugin');
const HtmlWebpackPlugin = require('html-webpack-plugin');
const TerserPlugin = require('terser-webpack-plugin');
module.exports = defineConfig({
  publicPath: './',
  outputDir: 'dist',
  assetsDir: 'static',
  transpileDependencies: true,
  productionSourceMap: false,
  devServer: {
    host: '0.0.0.0',
    port: 3000,
    proxy: {
      '/resource': {
        target: 'http://192.168.30.167',
        changeOrigin: true,
        rewrite: (path) => path.replace(new RegExp('^/resource'), '/resource')
      },
      '/irms': {
        target: 'http://192.168.30.167',
        changeOrigin: true,
        rewrite: (path) => path.replace(new RegExp('^/irms'), '/irms')
      },
      '/dmp': {
        target: 'http://192.168.30.167',
        changeOrigin: true,
        rewrite: (path) => path.replace(new RegExp('^/dmp'), '/dmp')
      }
    }
  },
  chainWebpack: (config) => {
    config.module
      .rule('glb')
      .test(/\.(glb|gltf)$/)
      .use('file-loader')
      .loader('file-loader')
      .options({
        name: 'models/[name].[hash:8].[ext]'
      });
  },
  configureWebpack: {
    resolve: {
      alias: {
        '@': path.resolve(__dirname, 'src') // 将@别名指向src目录
      }
    },
    optimization: {
      minimize: true, // 开启代码压缩
      minimizer: [
        new TerserPlugin({
          extractComments: false, // 设置为true以移除注释，默认为'all'
          terserOptions: {
            compress: {
              drop_console: false, // 删除所有的 `console` 语句
              dead_code: true // 去除无用的代码（默认为 false）
            },
            mangle: true // 开启混淆.
          }
        })
      ],
      splitChunks: {
        cacheGroups: {
          default: {
            minChunks: 1,
            priority: -30,
            reuseExistingChunk: true
          },
          vendors: {
            name: `chunk-vendors`,
            test: /[\\/]node_modules[\\/]/, // 指定需要分割的模块来自node_modules目录
            priority: -10 // 优先级，值越大优先级越高
          },
          common: {
            name: `chunk-common`,
            minChunks: 2,
            priority: -20,
            reuseExistingChunk: true // 如果模块已经被分割了，可以重用已有的块
          }
        }
      }
    },
    plugins: [
      new CompressionPlugin({
        algorithm: 'gzip', // 使用gzip压缩
        test: /\.js$|\.html$|\.css$/, // 匹配文件名
        filename: '[path][base].gz[query]', // 压缩后的文件名(保持原文件名，后缀加.gz)
        minRatio: 1, // 压缩率小于1才会压缩
        threshold: 10240, // 对超过10k的数据压缩
        deleteOriginalAssets: false // 是否删除未压缩的源文件，谨慎设置，如果希望提供非gzip的资源，可不设置或者设置为false（比如删除打包后的gz后还可以加载到原始资源文件）
      }),
      new HtmlWebpackPlugin({
        title: 'Yarward-自助查询机',
        chunksSortMode: 'auto',
        template: 'public/index.html', // 指定模板文件
        filename: 'template.html', // 指定生成的HTML文件名
        inject: true, // 是否将打包后的js/css自动注入到HTML中
        minify: {
          collapsewhitespace: true,
          removeComments: true
        }
      })
    ]
  }
});
